package _4lists.src.queue;

public class queue1 {
    //创建内部节点类
    private static class Node {
        int value;
        Node next;

        public Node(int value, Node next) {
            this.value = value;
            this.next = next;
        }
    }
    //创建头尾节点，初始没有任何数据，表示空节点
    //此时的两个空节点也就相当于同一个哨兵节点，方便后续添加
    Node head = new Node(-1, null);
    Node tial = head;

    //构造方法，使初始时形成一个空环
    //也就相当于让哨兵自己等于自己，形成闭环
    public queue1() {
        tial.next=head;
    }

    //向队尾插入节点（插入的元素在后面)
    public boolean offer(int value) {
        //创建出一个要添加的新节点，值是要添加的值，指向指得是哨兵（也就是head）
        Node add = new Node(value, head);
        //使末尾的节点的指向是该节点，根据图来做，也就是哨兵指向位置改变
        tial.next=add;
        //第一次添加后，该节点为第一个，后续添加在其后面tial.next=add;
        tial=add;
        return true;
    }

    //检查队列是否为空
    public boolean isEmpty() {
       /* if (head == null) {
            return true;
        }
        return false;*/
        return head==tial;
    }

    //获取第一个节点的值，但是不移除
    public int peek() {
        if (!isEmpty()) {
            return head.next.value;
        }
        return -1;
    }

    //获取第一个节点的值，同时移除
    public int poll() {
        if (!isEmpty()) {
            Node first=head.next;
            int val = first.value;
            //当只有一个节点是，first的下一个还是null
            head.next = first.next;
            if (first == tial) {
                tial=head;
            }
            return val;
        }
        return -1;
    }

    public static void main(String[] args) {
        queue1 queue1 = new queue1();
        queue1.offer(1);
        queue1.offer(2);
        queue1.offer(3);
        System.out.println(queue1);
    }
}
